#ifndef LECTEURPHRASESIMPLE_H_
#define LECTEURPHRASESIMPLE_H_

#include "LecteurSymbole.h"

class LecteurPhraseSimple {
public:
    LecteurPhraseSimple(string nomFich); // Construit un lecteur de phrase pour vérifier
                                        //  la syntaxe du programme dans le fichier nomFich

    void analyse();   // Si le contenu du fichier est conforme à la grammaire,
                     //  cette méthode se termine normalement et affiche un message "Syntaxe correcte".
                    //   Sinon, le programme sera interrompu (exit).
        	
private:
    LecteurSymbole ls;       //le lecteur de symboles utilisé pour analyser le fichier

    // implémentation de la grammaire
    void programme();       //<programme> ::= debut <seqInst> fin <EOF>
    void seqInst();	    //<seq_ins> ::= <inst> ; { <inst> ; }
    void inst();	    //<inst> ::= <affectation>   
    
    //Instruction / Affectations
    void affectation();	    //<affectation> ::= <variable> = <expression>
    void instSi();          //<instSi> ::=si ( <expBool> ) <seqInst> { sinonsi ( <expBool> ) <seqInst> }
    void instTq();          //<insTq> ::= tantque ( <expBool> ) <seqInst> fintantque
    void instRepeter();     //<instRepeter> ::= repeter <seqInst> jusqua (<expBool>)
    void instPour();        //<instPour> ::= pour (<affectation>;<expressionBool>;<affectation>) <seqInst> finpour
    
    //Entrees / Sorties
    void instLire();        //<insLire> ::= lire(<variable>)
    void instEcrire();      //<insEcrire> ::= ecrire(<expression> | <chaine>)
    
    //Expressions arithmétiques et booléennes
    void facteur();         //<facteur> ::= <entier>  |  <variable>  |  <expressionBool>  |  ( <expressionBool> )
    void expressionBool();  // <expressionBool> ::=  <termeBool> (<termeBool>)
    void termeBool();       //<termeBool> ::= <relation> { <relation> } 
    void relation();        //<relation> ::= <expression> { <opRel> <expression> }    
    void expression();	    //<expression> ::= <facteur> { <opAdd> <facteur> }
    void terme();           //<terme> ::= <facteur> { <opMult><facteur> }
    
    //Opérateurs arithmétiques et booléens
    void opAdd();          //<opAdd> ::= + | -
    void opMult();         //<oppMult> ::= * | /    
    void opRel();          //<opRel> ::= == | != | < | <= | > | >=
    void opUnaire();       //<opUnaire> ::= non | - 
    
   
    // outils pour se simplifier l'analyse syntaxique
    void testerSymCour (string ch);   // si symbole courant != ch, erreur : on arrete le programme, sinon rien
    void sauterSymCour (string ch);   // si symbole courant == ch, on passe au symbole suivant, sinon erreur : on arrete
    void erreur (string mess);        // affiche les message d'erreur mess et arrete le programme
};

#endif /* LECTEURPHRASESIMPLE_H_ */

